﻿using WindMill.Models.Cadastro;
using WindMill.Services;
using System;
using System.ComponentModel;
using System.Linq;


namespace WindMill.Models.Controladoria
{
    public partial class Finalidade: INotifyPropertyChanged, INotifyPropertyChanging
    {    
        private Moeda _moeda = null;

        public Moeda Moeda
        {
            get
            {
                if (CodMoeda == 0)
                    return null;

                if (_moeda == null || _moeda.Id != CodMoeda)
                {
                    var context = OracleConnectionPool.GetPool().GetDbContext<EDMCadastro>() as EDMCadastro;
                    _moeda = context.Moedas.SingleOrDefault(c => c.Id == CodMoeda);
                }

                return _moeda;
            }
            set
            {
                OnPropertyChanging("Moeda");
                _moeda = value;
                CodMoeda = value != null ? value.Id : 0;
                OnPropertyChanged("Moeda");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string property)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }
        }

        public event PropertyChangingEventHandler PropertyChanging;

        public void OnPropertyChanging(string property)
        {
            if (PropertyChanging != null)
            {
                PropertyChanging(this, new PropertyChangingEventArgs(property));
            }
        }

        public Exception ValidaFinalidade(string tipoFinalidade, int? codOperacao = null)
        {
            //No delphi está função verificava se a finalidade existia e caso fosse informado o codigo da operação verificava se a finalidade está na lista de 
            //finalidades permitidas pela função.

            //Nesse caso a função de verificação e feita a partir do proprio objeto finalidade, logo ela sempre existe, sendo assim, só é necessário fazer
            //a verificação da operação

            bool operacao = true;

            if (codOperacao != null)
            {
                operacao = false;
                //Verifica se a finalidade está na lista das permitidas da operação.
                operacao = Operacoes.Count(c => c.CodOperacaoEntrada == codOperacao) > 0;
            }

            if (!operacao
            || !IndLiberado.ToLower().Equals("sim")
            || (!IndTipo.ToUpper().Contains(tipoFinalidade.ToUpper())
                    && !IndTipo.ToUpper().Equals("ADIANTAMENTOS")
                    && !IndTipo.ToUpper().Equals("OUTRAS")
                    && !IndTipo.ToUpper().Equals("CHEQUES")))
            {
                string descricaoTipoFinalidade;
                if (tipoFinalidade.ToUpper().Contains("VENDA"))
                    descricaoTipoFinalidade = "CONTAS A RECEBER e VENDAS";
                else
                    descricaoTipoFinalidade = "CONTAS A PAGAR e COMPRAS";

                return new Exception("Finalidade não liberada para uso", new Exception("Verifique no cadastro de finalidades se a finalidade informada " +
                                    "está LIBERADA e se ela é para " + descricaoTipoFinalidade + " ou, se na operação " + codOperacao +
                                    " existe o registro da finalidade."));
            }
            return null;
        }

        public override string ToString()
        {
            return this.DescFinalidade;
        }
    }
}
